#include "mytcpsocket.h"
#include "../sql/sqlexec.h"
#include "../util/singleton.h"
#include "mythread.h"
#include <QDebug>
#include <QJsonDocument>
#include <QJsonObject>

MyTcpSocket::MyTcpSocket(QObject *parent) : QTcpSocket(parent) {
  connect(this, &MyTcpSocket::readyRead, this, &MyTcpSocket::readyReadSlot);

  connect(this, &MyTcpSocket::disconnected, this,
          &MyTcpSocket::disconnectedSlot);
}

void MyTcpSocket::setDB(SqlExec *db) { _db = db; }

void MyTcpSocket::sendDataSlot(QByteArray data) { this->write(data); }

void MyTcpSocket::readyReadSlot() {
  QByteArray data;
  data = this->readAll();
  handleData(data);
}

void MyTcpSocket::disconnectedSlot() {
  // disconnected
  emit socketDisconnected(qobject_cast<MyThread *>(thread()));
}

void MyTcpSocket::handleData(QByteArray data) {
  temp.append(data);
  int count = 0;
  for (int i = 0; i < temp.length(); i++) {
    if (temp.at(i) == '{') {
      if (count == 0) {
        temp = temp.mid(i, temp.length());
        i = 0;
        count++;
        continue;
      }
    }
    if (temp.at(i) == '}') {
      count--;
      if (count == 0) {
        QByteArray frame = temp.mid(0, i + 1);
        handleFrame(frame);
        temp = temp.mid(i + 1, temp.length());
        i = -1;
        continue;
      }
    }
  }
}

void MyTcpSocket::handleFrame(QByteArray data) {
  auto obj = QJsonDocument::fromJson(data).object();
  int devID = obj.value("dev").toInt();
  switch (devID) {
  case 1: {
    // LED
    if (!obj.value("ret1").isUndefined()) {
      // 上行数据
      auto content = QString("%1#%2#%3#%4")
                         .arg(obj.value("ret1").toInt())
                         .arg(obj.value("ret2").toInt())
                         .arg(obj.value("ret3").toInt())
                         .arg(obj.value("ret4").toInt());
      //      _db->add_dev_data(devID, content);
      _db->update_dev_data(devID, content);
    } else if (!obj.value("val1").isUndefined()) {
      // 下行控制
      emit sendData(data);
    }
  } break;
  case 2: {
    // 温湿度
    auto content = QString("%1#%2")
                       .arg(obj.value("ret1").toDouble())
                       .arg(obj.value("ret2").toDouble());
    _db->add_dev_data(devID, content);
    _db->update_dev_data(devID, content);
  } break;
  case 3: {
    // CO2
    auto content = QString("%1").arg(obj.value("ret").toDouble());
    _db->add_dev_data(devID, content);
    _db->update_dev_data(devID, content);
  } break;
  case 4: {
    // 光照
    auto content = QString("%1").arg(obj.value("ret").toDouble());
    _db->add_dev_data(devID, content);
    _db->update_dev_data(devID, content);
  } break;
  case 5: {
    // 紫外线
    auto content = QString("%1").arg(obj.value("ret").toDouble());
    _db->add_dev_data(devID, content);
    _db->update_dev_data(devID, content);
  } break;
  case 6: {
    // 烟雾
    auto content = QString("%1").arg(obj.value("ret").toDouble());
    _db->add_dev_data(devID, content);
    _db->update_dev_data(devID, content);
  } break;
  case 8: {
    // 火光
    auto content = QString("%1").arg(obj.value("ret").toDouble());
    _db->add_dev_data(devID, content);
    _db->update_dev_data(devID, content);
  } break;
  case 11: {
    // 风扇
    if (!obj.value("ret").isUndefined()) {
      // 上行数据
      auto content = QString("%1").arg(obj.value("ret").toInt());
      //      _db->add_dev_data(devID, content);
      _db->update_dev_data(devID, content);
    } else if (!obj.value("val").isUndefined()) {
      // 下行控制
      emit sendData(data);
    }
  } break;
  case 12: {
    // 继电器
    if (!obj.value("ret1").isUndefined()) {
      // 上行数据
      auto content = QString("%1#%2")
                         .arg(obj.value("ret1").toInt())
                         .arg(obj.value("ret2").toInt());
      //      _db->add_dev_data(devID, content);
      _db->update_dev_data(devID, content);
    } else if (!obj.value("val1").isUndefined()) {
      // 下行控制
      emit sendData(data);
    }
  } break;
  case 13: {
    // 步进电机
    if (!obj.value("ret").isUndefined()) {
      // 上行数据
      auto content = QString("%1").arg(obj.value("ret").toInt());
      //      _db->add_dev_data(devID, content);
      _db->update_dev_data(devID, content);
    } else if (!obj.value("val").isUndefined()) {
      // 下行控制
      emit sendData(data);
    }
  } break;
  case 0: {
    // 测试消息
    //    auto content = QString("%1").arg(obj.value("val").toString());
    //    _db->add_dev_data(0, content);
    //    _db->update_dev_data(0, content);
    break;
  }
  case 10: {
    // 舵机
    //    if (!obj.value("ret").isUndefined()) {
    //      // 上行数据
    //      auto content = QString("%1").arg(obj.value("ret").toBool());
    //      _db->add_dev_data(devID, content);
    //      _db->update_dev_data(devID, content);
    //    } else if (!obj.value("val").isUndefined()) {
    //      // 下行控制
    //      emit sendData(data);
    //    }
  } break;
  case 7:
  case 9:
  default:
    break;
  }
}
